package com.amigo.online.common.core.service;

import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * redis通用接口
 * @author amigo
 *
 */
public interface IRedisService {

	/**
     * 批量删除对应的value
     *
     * @param keys
     */
    void remove(final String... keys);

    /**
     * 批量删除key
     *
     * @param pattern
     */
    void removePattern(final String pattern);

    /**
     * 删除对应的value
     *
     * @param key
     */
    void remove(final String key);

    /**
     * 判断缓存中是否有对应的value
     *
     * @param key
     * @return
     */
    boolean exists(final String key);

    /**
     * 读取缓存
     *
     * @param key
     * @return
     */
    Object get(final String key);

    /**
     * 写入缓存
     *
     * @param key
     * @param value
     * @return
     */
    boolean set(final String key, Object value);

    /**
     * 写入缓存 并设置过期时间
     * @param key
     * @param value
     * @param expireTime
     * @return
     */
    boolean set(final String key, Object value, Long expireTime);
    
    
    /**
     * 读取缓存
     *
     * @param key
     * @return
     */
    List<?> getList(final String key);

    /**
     * 写入缓存
     *
     * @param key
     * @param value
     * @return
     */
    boolean setList(final String key, List<?> list);

    /**
     * 写入缓存 并设置过期时间
     * @param key
     * @param value
     * @param expireTime
     * @return
     */
    boolean setList(final String key, List<?> list, Long expireTime);
    /**
     * 根据Key刷新超时时间
     * @param key
     * @param expireTime
     * @return
     */
    boolean flushExpireTime(final String key, Long expireTime);

    // ================================Hash 操作=================================
    /**
     * 数量递增
     * @param key
     * @param field
     */
    Long increase(String key, String field);
    /**
     * 数量递减
     * @param key
     * @param field
     */
    Long decrease(String key, String field);

    /**
     * 删除一个Field
     * @param key
     * @param field
     */
    void deleteField(String key, String field);

    /**
     * 批量删除
     * @param key
     * @param field
     */
    void batchDeleteField(String key, String... field);

    /**
     * 根据key获取所有的Field
     * @param key
     * @return
     */
    @SuppressWarnings("rawtypes")
	Set getFields(String key);

    /**
     * 查看该字段是否已有
     * @param key
     * @param field
     * @return
     */
    boolean exists(String key, String field);

    /**
     * 获取值根据key和Field
     * @param key
     * @param field
     * @return value
     */
    Object getValueByKeyANdField(String key, String field);

    /**
     * 获取Field和Value
     * @param key
     * @return
     */
    Map<Serializable, Object>  getEntries(String key);

    /**
     * 加入
     * @param key
     * @param field
     * @param value
     */
    void put(String key, String field, Long value);
}
